package com.coolgor.xutil.Common;

import java.math.BigDecimal;



/**

* ����Java�ļ����Ͳ��ܹ���ȷ�ĶԸ�����������㣬�������ṩ��

* ȷ�ĸ��������㣬��(�Ӽ�˳���������롣

*/

public class Arith{



    //Ĭ�ϳ����㾫��

    private static final int DEF_DIV_SCALE = 10;



    //����಻��ʵ��

    private Arith(){

    }





    /**

     * �ṩ��ȷ�ļӷ����㡣

     * @param v1 ������

     * @param v2 ����

     * @return }�����ĺ�

     */

    public static double add(double v1,double v2){

        BigDecimal b1 = new BigDecimal(Double.toString(v1));

        BigDecimal b2 = new BigDecimal(Double.toString(v2));

        return b1.add(b2).doubleValue();

    }



    /**

     * �ṩ��ȷ�ļ����㡣

     * @param v1 ������

     * @param v2 ����

     * @return }�����Ĳ�

     */

    public static double sub(double v1,double v2){

        BigDecimal b1 = new BigDecimal(Double.toString(v1));

        BigDecimal b2 = new BigDecimal(Double.toString(v2));

        return b1.subtract(b2).doubleValue();

    }



    /**

     * �ṩ��ȷ�ĳ˷����㡣

     * @param v1 ������

     * @param v2 ����

     * @return }�����Ļ�

     */

    public static double mul(double v1,double v2){

        BigDecimal b1 = new BigDecimal(Double.toString(v1));

        BigDecimal b2 = new BigDecimal(Double.toString(v2));

        return b1.multiply(b2).doubleValue();

    }



    /**

     * �ṩ����ԣ���ȷ�ĳ����㣬�����������ʱ����ȷ��

     * С����Ժ�10λ���Ժ�������������롣

     * @param v1 ������

     * @param v2 ����

     * @return }��������

     */

    public static double div(double v1,double v2){

        return div(v1,v2,DEF_DIV_SCALE);

    }



    /**

     * �ṩ����ԣ���ȷ�ĳ����㡣�����������ʱ����scale����ָ

     * �����ȣ��Ժ�������������롣

     * @param v1 ������

     * @param v2 ����

     * @param scale ��ʾ��ʾ��Ҫ��ȷ��С����Ժ�λ��

     * @return }��������

     */

    public static double div(double v1,double v2,int scale){

        if(scale<0){

            throw new IllegalArgumentException(

                "The scale must be a positive integer or zero");

        }

        BigDecimal b1 = new BigDecimal(Double.toString(v1));

        BigDecimal b2 = new BigDecimal(Double.toString(v2));

        return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();

    }



    /**

     * �ṩ��ȷ��С��λ�������봦�?

     * @param v ��Ҫ�������������

     * @param scale С������λ

     * @return ���������Ľ��

     */

    public static double round(double v,int scale){

        if(scale<0){

            throw new IllegalArgumentException(

                "The scale must be a positive integer or zero");

        }

        BigDecimal b = new BigDecimal(Double.toString(v));

        BigDecimal one = new BigDecimal("1");

        return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();

    }
    
    
    
    

    /**

     * ��������ӣ�����String���ͣ�

     * @param a ������

     * @param b ����

     * @return ���

     */   
	public static String add(String a,String b)
	{
		String s=null;
		String result=null;
		int c=0;
		int r=0;
		int m;
		int n;
		int l;
		
		if (a.length()<b.length())
		{
			s=b;
			b=a;
			a=s;
			s=null;
		}
		l=a.length()-b.length();
		for (int i=b.length()-1;i>=0;i--)
		{ 
			m=Integer.parseInt(Character.toString(a.charAt(l+i)));
			n=Integer.parseInt(Character.toString(b.charAt(i)));	
			r=m+n;
			r=r+c;
			c=r/10;
			r=r%10;
			s=new String(Integer.toString(r));
			if (i==b.length()-1) result=new String(s);
			else result=new String(s+result);
		}
		for (int i=l-1;i>=0;i--)
		{
			m=Integer.parseInt(Character.toString(a.charAt(i)));
			n=0;
			r=m+n;
			r=r+c;
			c=r/10;
			r=r%10;
			s=new String(Integer.toString(r));
			result=new String(s+result);
		}
		if (c!=0)
		{
			s=new String(Integer.toString(c));
			result=new String(s+result);
		}
		return result;
	}
	
	
	
	
    /**

     * ��������ˣ�����String���ͣ�

     * @param a ������

     * @param b ����

     * @return ���

     */   
 	public static String mul(String a,String b)
	{
		String s=null;
		String result=null;
		String res=null;
		int c=0;
		int r=0;
		int m;
		int n;

		for (int i=b.length()-1;i>=0;i--)
		{
			m=Integer.parseInt(Character.toString(b.charAt(i)));
			for (int j=a.length()-1;j>=0;j--) 
			{
				n=Integer.parseInt(Character.toString(a.charAt(j)));				
				r=m*n;
				r=r+c;
				c=r/10;
				r=r%10;
				s=new String(Integer.toString(r));
				if (j==a.length()-1) res=new String(s);
				else res=new String(s+res);		
			}
			if (c!=0)
			{
				s=new String(Integer.toString(c));
				res=new String(s+res);
			}
			if (i==b.length()-1) result=new String(res);
			else 
			{
			    for(int j=b.length()-1-i;j>0;j--) res=res+"0";	
				result=add(result,res);
			} 
		}			
		return result;		
	} 
};

